package com.cnooc.aicv.lmapp.service;

import com.cnooc.aicv.lmapp.model.LMDiagMsg;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
 * 参数格式过来类，解决反序列化时content 嵌套结构问题。
 */
@Slf4j
@Service
public class LmDiagFilterImp {

    //private final ObjectMapper objectMapper = new ObjectMapper();

    String doFilterJonn(ObjectMapper objectMapper, LMDiagMsg lmDiagmsg) throws IOException {
        //  System.out.println( ">>>>>>>>>>>>>\n" +  jsonStr);  // 输出: 67
//        objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);     // 为了使JSON视觉上的可读性，在生产中不需如此，会增大Json的内容
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);  // 配置mapper忽略空属性
//格式设置
//        过滤
        String json = objectMapper.writeValueAsString(lmDiagmsg);

        String s = doJsonFilter(objectMapper, json);
        //结果跟踪
        log.info("jsonStr:\n" + s);
        //记-- 会有转义字符
        //objectMapper.writeValue(new File("lm-需要过滤处理掉value.json"), s);
// 无转义方式存文件
//        try (FileWriter fileWriter = new FileWriter("lm-dofilter-ex.json")) {
//            fileWriter.write(s);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

        return s;
    }

    /**
     * 调整 JSON 结构的方法。
     *
     * @param json 输入的 JSON 字符串
     * @return 调整后的 JSON 字符串
     */
    public String doJsonFilter(ObjectMapper objectMapper, String json) {
        try {
            // 解析输入的 JSON 字符串为 JsonNode
            objectMapper = new ObjectMapper();
            JsonNode rootNode = objectMapper.readTree(json);

            // 获取 messages 数组
            ArrayNode messages = (ArrayNode) rootNode.get("messages");

            // 遍历每个 message
            for (JsonNode message : messages) {
                // 获取 content 字段
                JsonNode content = message.get("content");

                // 检查 content 是否是对象且包含 value 键
                //if (content.isObject() && content.has("content"))
                if (content.isObject() && content.has("value"))
                {
                    // 使用 value 的值替换 content
                    ((ObjectNode) message).set("content", content.get("value"));
                }
            }

            // 返回调整后的 JSON 字符串
            return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode);
        } catch (Exception e) {
            throw new RuntimeException("处理 JSON 时发生错误", e);
        }
    }

    public static void main(String[] args) throws Exception {
        //模拟对象创建
        LmDiagFilterImp lmDiagMsg = new LmDiagFilterImp();
        String jsonFile = "C:\\Users\\liych46\\Downloads\\demo\\src\\main\\resources\\non-safety-helmet";
        String jsonStr = Files.readString(Paths.get(jsonFile));
        jsonStr.replaceAll("(\\r\\n|\\r|\\n)", "");;
        ObjectMapper objectMapper = new ObjectMapper();
        LMDiagMsg student = objectMapper.readValue(jsonStr, LMDiagMsg.class);

        String jsonStr0 = lmDiagMsg.doFilterJonn(objectMapper, student);
    }

}